參考網站:Keras官方指南
根據上面的參考網站,可以做出基本的類神經網路。
首先要先有基本的設定,大致上如下:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
因為keras目前被包含在tensorflow中,因此要先匯入tensorflow,才能匯入keras。
再來建立Sequential model,這模組可以讓每一層都僅有一個輸入張量(tensor)以及輸出張量,我前面有提到每一層中並非只有一個神經元,一個隱藏層中可能就很多神經元進行不同筆資料的運算,因此得要整合,限制只能有一個輸入以及輸出,而且張量也能幫助進行線性的運算。網站提供程式如下:
model = keras.Sequential(
[
layers.Dense(2, activation="relu", name="layer1"),
layers.Dense(3, activation="relu", name="layer2"),
layers.Dense(4, name="layer3"),
]
)
在layer.Dense中,activation是激勵函數,主要用來引入非線性資料。因為在訓練類神經網路的時候,輸入和輸出的部分仍然脫離不了線性關係,必須要能讓訓練過的資料輸出給下一層,因此可以用激勵函數來引入非線性資料。激勵函數有:sigmoid, tanh, Relu⋯⋯等等。
最後要輸入資料以及建立模組來測試是否成功:
x = tf.ones((3, 3))
y = model(x)
tensorflow中的ones類別,可以創造所有元素都設置為1的張量,以上面程式為例,(3, 3)的意思就是建立一個3x3的矩陣,且該矩陣中的所有元素皆為1。
接著用以下的輸出來看看建立的如何:「」
print(model.summary())
得到如下:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
layer1 (Dense) (3, 2) 8
_________________________________________________________________
layer2 (Dense) (3, 3) 9
_________________________________________________________________
layer3 (Dense) (3, 4) 16
=================================================================
Total params: 33
Trainable params: 33
Non-trainable params: 0
_________________________________________________________________
None
params為參數,也就是權重的個數。當輸入資料時,不同資料與神經元之間會有權重(之前的類神經網路架構的圖,有個神經元要傳送到下一層的神經元時,會乘上各自的權重),這不同的權重個數加總起來就是params。
因為設定的dense層為基礎神經網路,因此param計算:(輸入數據維度+1)×神經元個數,可是網站提供的設定是(3, 3)這樣維度看起來有2。
經過測試之後,我的想法是因為dense層很基礎,因此就算輸入的矩陣有多少,主要還是看最後的數字來決定,這維度是只有多少個神經元(以(3,4)為例子較好理解,也就是這輸入層中每個神經元的資料是[1, 1, 1],然後有4個同樣的神經元),因此layer1的params計算為(3+1)×2=8,接著layer2因為layer1的神經元設定只有2,因此layer2的計算為(2+1)3=9⋯⋯以此類推。
當我把設定tf.ones更改為(3,4,2)得出結果:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
layer1 (Dense) (3, 4, 2) 6
_________________________________________________________________
layer2 (Dense) (3, 4, 3) 9
_________________________________________________________________
layer3 (Dense) (3, 4, 4) 16
=================================================================
Total params: 31
Trainable params: 31
Non-trainable params: 0
_________________________________________________________________
None
可以看出param在dense層時,只會受到最後的數字影響,且該數字為這一層中有多少神經元。
只不過以上是我測試多筆資料後的觀察,因為實在找不到相關的解釋,因此才這麼想。